﻿using System;
using web_uchet.Models;
using System.Linq;
using System.Data.Objects;
using System.Collections.Generic;
using Mvc.Validation.Validators;
using web_uchet.Security.Enums;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using System.Web.Mvc;
using System.Text;
namespace web_uchet.ViewModels
{
    public interface IViewЗаказ
    {
        Заказ Заказ{ get;}
        int ClientID { get; set;  }
        int CurrencyID { get; set; }
        int ExecutiveID { get; set;  }
        int ManagerID { get; set; }
        Валюта Валюта { get; set; }
        System.Data.Objects.DataClasses.EntityReference<Валюта> ВалютаReference { get; set; }
        bool Выполнено { get; set; }
        DateTime? Дата_Выполнения { get; set; }
        DateTime? Дата_Поступления { get; set; }
        Int64 ИД_Заказа { get; }
        Пользователь Исполнитель { get; set; }
        System.Data.Objects.DataClasses.EntityReference<Пользователь> ИсполнительReference { get; set; }
        Клиент Клиент { get; set; }
        System.Data.Objects.DataClasses.EntityReference<Клиент> КлиентReference { get; set; }
        Пользователь Менеджер { get; set; }
        System.Data.Objects.DataClasses.EntityReference<Пользователь> МенеджерReference { get; set; }
        string Описание { get; set; }
        bool Отменен { get; set; }
        ///float? 
        string Цена { get; set; }
        string Оплачено { get; set; }
        string Скидка { get; set; }
    }
    [System.Web.Mvc.Bind(Exclude = "ИД_Заказа,ИД_Компании")]    
    public class ViewЗаказ : IViewЗаказ
    {
        private Заказ _Заказ;
        public Заказ Заказ { get { return this._Заказ; } }
        public ViewЗаказ()
        {
            this._Заказ = new Заказ();
            this._Заказ.КлиентReference.EntityKey =
                    new System.Data.EntityKey("ModelWebUchetCon.Клиенты", "ИД_Клиент", 0);
            this._Заказ.ВалютаReference.EntityKey =
                    new System.Data.EntityKey("ModelWebUchetCon.Валюты", "ИД_Валюты", 0);
            this._Заказ.ИсполнительReference.EntityKey =
                    new System.Data.EntityKey("ModelWebUchetCon.Пользователи", "ИД_Пользователя", 0);
            this._Заказ.МенеджерReference.EntityKey =
                    new System.Data.EntityKey("ModelWebUchetCon.Пользователи", "ИД_Пользователя", 0);
            this._Заказ.КомпанияReference.EntityKey =
                new System.Data.EntityKey("ModelWebUchetCon.Компании", "ИД_Компании", 0);
            this._Заказ.Описание = string.Empty;

        }
        public ViewЗаказ(Заказ Base)
        {
            this._Заказ = Base;
        }

        public int ClientID 
        {
            get
            {
                //if (this._Заказ.КлиентReference.IsLoaded)
                    return Convert.ToInt32(
                    this._Заказ.КлиентReference.EntityKey.EntityKeyValues.First(k => k.Key == "ИД_Клиент").Value);
                //else return null;
            }
            set
            {
                this._Заказ.КлиентReference.EntityKey =
                    new System.Data.EntityKey("ModelWebUchetCon.Клиенты", "ИД_Клиент", value);
            }
        }
        public int CurrencyID
        {
            get
            {
                //if (this._Заказ.ВалютаReference.IsLoaded)
                return Convert.ToInt32(
                this._Заказ.ВалютаReference.EntityKey.EntityKeyValues.First(k => k.Key == "ИД_Валюты").Value);
                //else return null;
            }
            set
            {
                this._Заказ.ВалютаReference.EntityKey =
                    new System.Data.EntityKey("ModelWebUchetCon.Валюты", "ИД_Валюты", value);
            }
        }
        public int ExecutiveID
        {
            get
            {
                //if (this._Заказ.ИсполнительReference.IsLoaded)
                return Convert.ToInt32(
                this._Заказ.ИсполнительReference.EntityKey.EntityKeyValues.First(k => k.Key == "ИД_Пользователя").Value);
                //else return null;
            }
            set
            {
                this._Заказ.ИсполнительReference.EntityKey =
                    new System.Data.EntityKey("ModelWebUchetCon.Пользователи", "ИД_Пользователя", value);
            }
        }
        public int ManagerID
        {
            get
            {
                //if (this._Заказ.ВалютаReference.IsLoaded)
                return Convert.ToInt32(
                this._Заказ.МенеджерReference.EntityKey.EntityKeyValues.First(k => k.Key == "ИД_Пользователя").Value);
                //else return null;
            }
            set
            {
                this._Заказ.МенеджерReference.EntityKey =
                    new System.Data.EntityKey("ModelWebUchetCon.Пользователи", "ИД_Пользователя", value);
            }
        }
        public int ИД_Компании
        {
            get { return Convert.ToInt32(this.КомпанияReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Компании").Value); }
            set { this.КомпанияReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Компании", "ИД_Компании", value); }
        }
        #region IViewЗаказ Members

        public Валюта Валюта
        {
            get
            {
                if (!this.Заказ.ВалютаReference.IsLoaded)
                    this.Заказ.ВалютаReference.Load();
                return this._Заказ.Валюта;
            }
            set
            {
                if (!this.Заказ.ВалютаReference.IsLoaded)
                    this.Заказ.ВалютаReference.Load();
                this._Заказ.Валюта = value;
            }
        }

        public System.Data.Objects.DataClasses.EntityReference<Валюта> ВалютаReference
        {
            get
            {
                return this._Заказ.ВалютаReference;
            }
            set
            {
                this._Заказ.ВалютаReference = value;
            }
        }
        public bool Выполнено
        {
            get
            {
                return this._Заказ.Выполнено;
            }
            set
            {
                this._Заказ.Выполнено = value;
            }
        }
        [RegularExpressionValidator(Pattern = "^[0-9]{2,2}-[0-9]{2,2}-[0-9]{4,4} [0-9]{2,2}:[0-9]{2,2}$", MessageTemplate = StringResources.ValidationStringResources.DateTimeValidationMessage)]
        public DateTime? Дата_Выполнения
        {
            get
            {
                return this._Заказ.Дата_Выполнения;
            }
            set
            {
                this._Заказ.Дата_Выполнения = value;
            }
        }
        [RegularExpressionValidator(Pattern = "^[0-9]{2,2}-[0-9]{2,2}-[0-9]{4,4} [0-9]{2,2}:[0-9]{2,2}$", MessageTemplate = StringResources.ValidationStringResources.DateTimeValidationMessage)]
        public DateTime? Дата_Поступления
        {
            get
            {
                return this._Заказ.Дата_Поступления;
            }
            set
            {
                this._Заказ.Дата_Поступления = value;
            }
        }
        [RegularExpressionValidator(Pattern = "^[0-9]{2,2}-[0-9]{2,2}-[0-9]{4,4} [0-9]{2,2}:[0-9]{2,2}$", MessageTemplate = StringResources.ValidationStringResources.DateTimeValidationMessage)]
        public DateTime? Дата_Назначения
        {
            get
            {
                return this._Заказ.Дата_Назначения;
            }
            set
            {
                this._Заказ.Дата_Назначения = value;
            }
        }
        [System.ComponentModel.DataAnnotations.ScaffoldColumn(false)]
        public Int64 ИД_Заказа
        {
            get { return this._Заказ.ИД_Заказа; }
        }

        public Пользователь Исполнитель
        {
            get
            {
                if (!this.Заказ.ИсполнительReference.IsLoaded)
                    this.Заказ.ИсполнительReference.Load();
                return this._Заказ.Исполнитель;
            }
            set
            {
                if (!this.Заказ.ИсполнительReference.IsLoaded)
                    this.Заказ.ИсполнительReference.Load();
                this._Заказ.Исполнитель = value;
            }
        }

        public System.Data.Objects.DataClasses.EntityReference<Пользователь> ИсполнительReference
        {
            get
            {
                return this._Заказ.ИсполнительReference;
            }
            set
            {
                this._Заказ.ИсполнительReference = value;
            }
        }

        public Клиент Клиент
        {
            get
            {
                if (!this.Заказ.КлиентReference.IsLoaded)
                    this.Заказ.КлиентReference.Load();
                return this._Заказ.Клиент;
            }
            set
            {
                if (!this.Заказ.КлиентReference.IsLoaded)
                    this.Заказ.КлиентReference.Load();
                this._Заказ.Клиент = value;
            }
        }

        public System.Data.Objects.DataClasses.EntityReference<Клиент> КлиентReference
        {
            get
            {
                return this._Заказ.КлиентReference;
            }
            set
            {
                this._Заказ.КлиентReference = value;
            }
        }

        public Пользователь Менеджер
        {
            get
            {
                if (!this.Заказ.МенеджерReference.IsLoaded)
                    this.Заказ.МенеджерReference.Load();
                return this._Заказ.Менеджер;
            }
            set
            {
                if (!this.Заказ.МенеджерReference.IsLoaded)
                    this.Заказ.МенеджерReference.Load();
                this._Заказ.Менеджер = value;
            }
        }

        public System.Data.Objects.DataClasses.EntityReference<Пользователь> МенеджерReference
        {
            get
            {
                return this._Заказ.МенеджерReference;
            }
            set
            {
                this._Заказ.МенеджерReference = value;
            }
        }
        [StringLengthValidator(250, MessageTemplate = StringResources.ValidationStringResources.StringLength250ValidationMessage)]
        public string Описание
        {
            get
            {
                return this._Заказ.Описание;
            }
            set
            {
                if (value == null) this._Заказ.Описание = string.Empty;
                    else
                this._Заказ.Описание = value;
            }
        }
        //[NotNullOrEmptyValidator(MessageTemplate="Не может иметь неопределенное значение")]
        //[PropertyComparisonValidator("Выполнено", ComparisonOperator.NotEqual,
        //    MessageTemplate = "Заказ не может быть выполнен и отменен одновременно")]
        public bool Отменен
        {
            get
            {
                return this._Заказ.Отменен;
            }
            set
            {
                this._Заказ.Отменен = value;
            }
        }
        [Mvc.Validation.Validators.RegularExpressionValidator(Pattern = "^[0-9]*$", MessageTemplate = StringResources.ValidationStringResources.NumericValidationMessage)]
        public string Цена //float? Цена_Услуги
        {
            get
            {
                return this._Заказ.Цена.ToString();
            }
            set
            {   float outF;
                if (float.TryParse(value,out outF))
                    this._Заказ.Цена = outF;
                else this._Заказ.Цена = null;
            }
        }
        [Mvc.Validation.Validators.RegularExpressionValidator(Pattern = "^[0-9]*$", MessageTemplate = StringResources.ValidationStringResources.NumericValidationMessage)]
        public string Оплачено //float? Цена_Услуги
        {
            get
            {
                return this._Заказ.Оплачено.ToString();
            }
            set
            {
                float outF;
                if (float.TryParse(value, out outF))
                    this._Заказ.Оплачено = outF;
                else this._Заказ.Оплачено = null;
            }
        }
        [Mvc.Validation.Validators.RegularExpressionValidator(Pattern = "^[0-9]*$", MessageTemplate = StringResources.ValidationStringResources.NumericValidationMessage)]
        [StringLengthValidator(3, MessageTemplate = StringResources.ValidationStringResources.StringLength3ValidationMessage)]
        public string Скидка //float? Цена_Услуги
        {
            get
            {
                return this._Заказ.Скидка.ToString();
            }
            set
            {
                float outF;
                if (float.TryParse(value, out outF))
                    this._Заказ.Скидка = outF;
                else this._Заказ.Скидка = null;
            }
        }
        public float Долг
        {
            get 
            {
                if (this._Заказ.Цена.HasValue) return this.Цена_со_скидкой - (this._Заказ.Оплачено.HasValue ? this._Заказ.Оплачено.Value : 0);
                else return 0;
            }
        }
        public float Цена_со_скидкой
        {
            get 
            {
                if (this._Заказ.Цена.HasValue && this._Заказ.Скидка.HasValue)
                    return this._Заказ.Цена.Value - this._Заказ.Цена.Value * this._Заказ.Скидка.Value / 100;
                else if (this._Заказ.Цена.HasValue)
                    return this._Заказ.Цена.Value;
                else return 0;
            }
        }

        public Компания Компания
        {
            get
            {
                if (!this.Заказ.КомпанияReference.IsLoaded)
                    this.Заказ.КомпанияReference.Load(); 
                return this._Заказ.Компания;
            }
        }
        public System.Data.Objects.DataClasses.EntityReference<Компания> КомпанияReference
        {
            get { return this._Заказ.КомпанияReference; }
        }

        public  IEnumerable<ViewДеталь_Заказа> Детали
        {
            get { return this.Заказ.Детали.Select(e=>new ViewДеталь_Заказа(e)); }
        }       
        #endregion
    }

    public class ViewЗаказOperationProvider
    {
        public ViewЗаказOperationProvider(web_uchet.Security.ProgramContext MData)
        {
            this._SecurityContext = MData;
            this._Context = new ModelWebUchetCon(ModelWebUchetCon.SingleToneConnection);
        }
        private web_uchet.Security.ProgramContext _SecurityContext;
        private ModelWebUchetCon _Context;

        public ViewЗаказOperationProvider(ModelWebUchetCon Context, web_uchet.Security.ProgramContext MData)
        {
            this._SecurityContext = MData;
            this._Context = Context;
        }

        //v CompanyID - ID компании для которой делаем LIST
        public IEnumerable<ViewЗаказ> List(int CompanyID)
        {
            return this._Context.Заказы.Where(e => e.Компания.ИД_Компании == CompanyID).ToList()
                .Select(e => new ViewЗаказ(e));
        }
        /// <summary>
        /// Получить IQueryable заказы на компанию\пользователя\клиента
        /// </summary>
        /// <param name="CompanyID">Если получаем заказы на компанию, то подставить значение, иначе null</param>
        /// <param name="UserID">Если получаем заказы на пользователя, то подставить значение, иначе null</param>
        /// <param name="ClientID">Если полуаем заказы на Клиента, то подставить значение, иначе null</param>
        /// <returns></returns>
        public IQueryable<Заказ> IQueryableOrders(int? CompanyID,int? UserID,int? ClientID)
        {
            if (UserID.HasValue)
            {
                //Проверка запросил ли пользователь данные действительно на себя:
                int CurUserKey = Convert.ToInt32(System.Web.Security.Membership.GetUser().ProviderUserKey);
                if (CurUserKey != UserID.Value) throw new System.Security.SecurityException("Попытка получить данные чужой компании");
                return this._Context.Заказы.Include("Клиент").Include("Валюта").Include("Исполнитель").Include("Менеджер")
                .Where(e => e.Компания.ИД_Компании == CompanyID&&(e.Менеджер.ИД_Пользователя==UserID.Value||
                    e.Исполнитель.ИД_Пользователя==UserID.Value));
            }
            else if (ClientID.HasValue)
            {
                int ClientComanyID = this._Context.Клиенты.Include("Компания").First(e=>e.ИД_Клиент==ClientID.Value).Компания.ИД_Компании;
                if (this._SecurityContext.CompanyID != ClientComanyID) 
                    throw new System.Security.SecurityException("Попытка получить данные чужой компании");

                return this._Context.Заказы.Include("Клиент").Include("Валюта").Include("Исполнитель").Include("Менеджер")
                .Where(e => e.Клиент.ИД_Клиент == ClientID);
            }
            else
                return this._Context.Заказы.Include("Клиент").Include("Валюта").Include("Исполнитель").Include("Менеджер")
                    .Where(e => e.Компания.ИД_Компании == CompanyID.Value);
        }
        
        /// <summary>
        /// Filters Orders by Date
        /// </summary>
        /// <param name="Data">IQueryable of Заказ to be filtered. If null, creates new IQueryable<Заказ> from ObjectContext and
        /// filters it</param>
        /// <param name="Date"> Date to be filtered by</param>
        /// <returns></returns>
        public IQueryable<Заказ> FilterByDate(IQueryable<Заказ> Data,DateTime Date)
        {
            Date=Date.Date;
            DateTime Tomorrow = Date.AddDays(1);
            if (Data==null)
            return this._Context.Заказы.Include("Клиент").Include("Валюта").Include("Исполнитель").Include("Менеджер")
                .Where(e => e.Компания.ИД_Компании == this._SecurityContext.CompanyID &&
                (e.Дата_Назначения.HasValue && (e.Дата_Назначения >= Date && e.Дата_Назначения < Tomorrow)));
            else
                return Data.Where(e => e.Дата_Назначения.HasValue && (e.Дата_Назначения >= Date && e.Дата_Назначения < Tomorrow));
        }
        /// <summary>
        /// Filters Orders by date range
        /// </summary>
        /// <param name="Data">Query to filter</param>
        /// <param name="DateStart">start of range</param>
        /// <param name="DateEnd">end of range</param>
        /// <returns></returns>
        public IQueryable<Заказ> FilterByDateRange(IQueryable<Заказ> Data, DateTime DateStart, DateTime DateEnd)
        {
            if (Data == null)
                return this._Context.Заказы.Include("Клиент").Include("Валюта").Include("Исполнитель").Include("Менеджер")
                    .Where(e => e.Компания.ИД_Компании == this._SecurityContext.CompanyID &&
                    (e.Дата_Назначения.HasValue && (e.Дата_Назначения >= DateStart && e.Дата_Назначения <= DateEnd)));
            else
                return Data.Where(e => e.Дата_Назначения.HasValue && (e.Дата_Назначения >= DateStart && e.Дата_Назначения <= DateEnd));
        }

        public ViewЗаказ Details(Int64 OrderID, bool IncludeDetails)
        {

            ViewЗаказ NeededOrder; //Заказ з; з.Валюта_Услуги.Детали.First().Валюта_Услуги
            if (IncludeDetails)
            {
                NeededOrder =
                    new ViewЗаказ(this._Context.Заказы.Include("Валюта").Include("Детали.Услуга").
                        Include("Детали.Валюта").First(e => e.ИД_Заказа == OrderID));
            }
            else
            {
                NeededOrder =
                new ViewЗаказ(this._Context.Заказы.Include("Валюта").First(e => e.ИД_Заказа == OrderID));
            }
            if (Convert.ToInt32(
                NeededOrder.КомпанияReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Компании").Value) == 
                this._SecurityContext.CompanyID)
                return NeededOrder;
            else throw new System.Security.SecurityException("Попытка получить данные чужой компании");
        }
        //Disable User
        public void Delete(Int64 OrderID)
        {
            Заказ ObjectToDelete = this.Details(OrderID,false).Заказ;
            var ChangesToDelete=this._Context.Изменения_Заказов.Where(e => e.Заказ.ИД_Заказа == ObjectToDelete.ИД_Заказа);
            var ODetailtToDelete = this._Context.Детали_Заказов.Where(e => e.Заказ.ИД_Заказа == ObjectToDelete.ИД_Заказа);
            foreach (var RelatedChange in ChangesToDelete)
            {
                this._Context.DeleteObject(RelatedChange);
            }
            foreach (var RelatedDetail in ODetailtToDelete)
            {
                this._Context.DeleteObject(RelatedDetail);
            }
            this._Context.DeleteObject(ObjectToDelete);
            this._Context.SaveChanges();
        }

        public void Create(ViewЗаказ NewViewЗаказ)
        {            
            this._Context.AddToЗаказы(NewViewЗаказ.Заказ);
            if (this._SecurityContext.Roles.Contains(UserRoleEnum.Менеджер)) NewViewЗаказ.МенеджерReference.EntityKey =
                  new System.Data.EntityKey("ModelWebUchetCon.Пользователи", "ИД_Пользователя", this._SecurityContext.UserID);
            NewViewЗаказ.ИД_Компании = this._SecurityContext.CompanyID;

            this.SaveChanges(NewViewЗаказ);
        }
        public void SaveChanges(ViewЗаказ UpdateViewЗаказ)
        {
            if (this._SecurityContext.Roles.Contains(UserRoleEnum.Менеджер)) UpdateViewЗаказ.МенеджерReference.EntityKey =
                  new System.Data.EntityKey("ModelWebUchetCon.Пользователи", "ИД_Пользователя", this._SecurityContext.UserID);
            this.CheckViewЗаказ(UpdateViewЗаказ);
            this._Context.SaveChanges(true);
        }

        public void CheckViewЗаказ(ViewЗаказ UpdateViewЗаказ)
        {
            if (new web_uchet.ViewModels.ViewКлиент(
                this._Context.Клиенты.First(e => e.ИД_Клиент == UpdateViewЗаказ.ClientID)).ИД_Компании != this._SecurityContext.CompanyID)
            throw new System.Security.SecurityException("Попытка получить данные чужой компании");

            if (Convert.ToInt32(this._Context.Пользователи.First(e => e.ИД_Пользователя == UpdateViewЗаказ.ExecutiveID).
                КомпанияReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Компании").Value) != this._SecurityContext.CompanyID)
                throw new System.Security.SecurityException("Попытка получить данные чужой компании");

            if (Convert.ToInt32(this._Context.Пользователи.First(e => e.ИД_Пользователя == UpdateViewЗаказ.ManagerID).
                КомпанияReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Компании").Value) != this._SecurityContext.CompanyID)
                throw new System.Security.SecurityException("Попытка получить данные чужой компании");

            if (UpdateViewЗаказ.Отменен && UpdateViewЗаказ.Выполнено)
                throw new ArgumentException("Заказ не может быть отменен и выполнен одновременно");
        }

        public void Cancel(Int64 OrderID, web_uchet.Security.ProgramContext SecurirtyData)
        {
            Заказ ObjectToCancel = this.Details(OrderID, false).Заказ;
            ObjectToCancel.Отменен = true;
            this.LogOrderChanges(ObjectToCancel);
            this.SaveChanges(new ViewЗаказ(ObjectToCancel));
        }

        public void SetExecuted(Int64 OrderID, DateTime? ExecutedDate) 
        {
            Заказ ObjectToExecute = this.Details(OrderID,false).Заказ;
            ObjectToExecute.Выполнено = true;
            ObjectToExecute.Дата_Выполнения = ExecutedDate;
            this.LogOrderChanges(ObjectToExecute);
            this.SaveChanges(new ViewЗаказ(ObjectToExecute));            
        }

        public SelectList GetCurrencies(int? CurrencyID )
        {
            return web_uchet.ViewModels.SelectLists.SelectListService.GetCurrencies(CurrencyID, this._Context);
        }

        public IEnumerable<Валюта> GetIEnumCurrencies()
        {
            return web_uchet.ViewModels.SelectLists.SelectListService.GetIEnumCurrencies(this._Context);
        }

        public IEnumerable<web_uchet.ViewModels.ViewУслуга_Компании> GetIEnumServices()
        {
            return web_uchet.ViewModels.SelectLists.SelectListService.GetIEnumServices(this._Context, this._SecurityContext.CompanyID);
        }

        public void LogOrderChanges(Заказ UpdateЗаказ)
        {
            if(UpdateЗаказ.EntityState==System.Data.EntityState.Modified)
            {
                ObjectStateEntry StateEntry=
                this._Context.ObjectStateManager.GetObjectStateEntry(UpdateЗаказ);
                StringBuilder OldValues=new StringBuilder();
                StringBuilder NewValues=new StringBuilder();
                foreach(var ChangedProperty in StateEntry.GetModifiedProperties())
                {
                    OldValues.AppendLine(ChangedProperty+": "+
                        StateEntry.OriginalValues[ChangedProperty].ToString() + " ");
                    NewValues.AppendLine(ChangedProperty + ": " +
                        StateEntry.CurrentValues[ChangedProperty].ToString() + " ");
                }
                if (OldValues.Length>255) OldValues.Length=255;
                if (NewValues.Length>255) NewValues.Length=255;
                Изменение_Заказа OrderChange = new Изменение_Заказа();
                OrderChange.Заказ = UpdateЗаказ;
                OrderChange.ПользовательReference.EntityKey = 
                    new System.Data.EntityKey("ModelWebUchetCon.Пользователи", "ИД_Пользователя", this._SecurityContext.UserID);
                OrderChange.КомпанияReference.EntityKey =
                    new System.Data.EntityKey("ModelWebUchetCon.Компании", "ИД_Компании", this._SecurityContext.CompanyID);
                OrderChange.Новое_Значение = NewValues.ToString();
                OrderChange.Старое_Значение = OldValues.ToString();
                this._Context.AddToИзменения_Заказов(OrderChange);
            }
        }

        public IEnumerable<ViewЗаказ> GetUnHostedOrders()
        {
            int EmptyUserID = this._Context.Пользователи.Where(e => e.Компания.ИД_Компании == this._SecurityContext.CompanyID)
                .First(e1 => e1.Имя_Настоящее == "Нет").ИД_Пользователя;
            return this._Context.Заказы.Where(e => e.Компания.ИД_Компании == this._SecurityContext.CompanyID &&
                e.Исполнитель.ИД_Пользователя == EmptyUserID && !e.Отменен && !e.Выполнено).ToList().Select(e1 => new ViewЗаказ(e1));
        }
        public bool HostOrder(Int64 OrderID)
        {
            ViewЗаказ NeededOrder = this.Details(OrderID,false);
            int EmptyUserID = this._Context.Пользователи.First(e1 => e1.Имя_Настоящее == "Нет").ИД_Пользователя;

            if (((int)NeededOrder.ИсполнительReference.EntityKey.EntityKeyValues.First(e=>e.Key=="ИД_Пользователя").Value)
                == EmptyUserID && !NeededOrder.Отменен && !NeededOrder.Выполнено)
            {
                NeededOrder.Заказ.ИсполнительReference.EntityKey = new System.Data.EntityKey
                ("ModelWebUchetCon.Пользователи", "ИД_Пользователя", this._SecurityContext.UserID);
                this.SaveChanges(NeededOrder);
                return true;
            }
            else return false;
        }

        public static object getJSONForJQGrid(Заказ[] inData, web_uchet.JQgridProcess.GridSettings grid)
        {
            var Server = System.Web.HttpContext.Current.Server;
            var data = inData;//.Select(e => new ViewЗаказ(e));
            var result = new
            {
                total = (int)Math.Ceiling((double)grid.count / grid.rows),
                page = grid.page,
                records = grid.count,
                rows = (from Заказ in data
                        select new
                        {
                            id = Заказ.ИД_Заказа,
                            cell = new object[]
                                  {
                                      //Менеджер = 
                                      Server.HtmlEncode(Заказ.Менеджер.Имя_Настоящее),
                                      //Исполнитель = 
                                      Server.HtmlEncode(Заказ.Исполнитель.Имя_Настоящее),
                                      //Дата_Назначения = 
                                      string.Format("{0:dd-MM-yyyy HH:mm}", Заказ.Дата_Назначения),
                                      //Клиент = 
                                      Server.HtmlEncode(Заказ.Клиент.Имя),
                                      //ОписаниеКлиента = 
                                      Server.HtmlEncode(Заказ.Описание),
                                      //Цена_со_скидкой = 
                                      Server.HtmlEncode( (Заказ.Цена.HasValue?Заказ.Цена + " " + Заказ.Валюта.Символ:string.Empty) +
                                      (Заказ.Скидка.HasValue?" -"+Заказ.Скидка.ToString()+"%":string.Empty)),
                                      //Выполнено = 
                                      Заказ.Выполнено.ToString(),
                                      //Отменен = 
                                      Заказ.Отменен
                                  }
                        }).ToArray()
            };
            return result;
        }
    }
}
